﻿using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace 异步编程
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            //Task<int> task = p.AccessTheWebAsync();
            //Console.WriteLine(task.Result);
            p.Test();
        }

        /// <summary>
        /// 异步访问 Web
        /// </summary>
        /// <returns></returns>
        /// <remarks>
        /// 方法签名的 3 要素：
        ///     ① async 修饰符
        ///     ② 返回类型 Task 或 Task<TResult>：这里的 Task<int> 表示 return 语句返回 int 类型
        ///     ③ 方法名以 Async 结尾
        /// </remarks>
        async Task<int> AccessTheWebAsync()
        {
            //记得 using System.Net.Http 哦
            var client = new HttpClient();

            //执行异步方法 GetStringAsync，假如需要比较久的时间，或者卡住了，
            // 就将执行权限返还给主线程，继续往下执行
            Task<string> getStringTask = client.GetStringAsync("http://www.baidu.com/");

            //假设在这里执行一些非异步的操作
            Do();

            //等待操作挂起方法 AccessTheWebAsync
            //直到 getStringTask 完成，AccessTheWebAsync 方法才会继续执行
            //同时，控制将返回到 AccessTheWebAsync 方法的调用方
            //直到 getStringTask 完成后，将在这里恢复控制。
            //然后从 getStringTask 拿到字符串结果
            string urlContents = await getStringTask;

            //返回字符串的长度（int 类型）
            return urlContents.Length;
        }

        static void Do()
        {
            Console.WriteLine(Thread.CurrentThread.Name);
            for (int i = 0; i < 10; i++)
            {
                // Thread.Sleep(1000);
                Console.WriteLine("aa"+Thread.CurrentThread.Name);
            }
        }

        public async void Test()
        {
            Task<string> getStringTask = GetStringAsync();
            for(int i = 0; i < 10; i++)
            {
                Console.WriteLine("主线程执行点任务");
            }
            string urlContents = await getStringTask;
            Console.WriteLine(urlContents);
        }


        public void LongTimeWork()
        {
            Console.WriteLine("long time work start");
            Thread.Sleep(1000000);
            Console.WriteLine("long time work finish");
        }

        public Task<String> GetStringAsync()
        {
            LongTimeWork();
            return Task.FromResult("GetStringAsync");
        }
    }
}
